package cc.cix.gt.common.util;


import cc.cix.gt.common.entity.Tree;
import cn.hutool.core.util.ObjectUtil;

import java.util.ArrayList;
import java.util.List;

/**
 * @author cix
 */
public abstract class TreeUtil {

    private static Long TOP_NODE_ID = 0L;

    /**
     * 用于构建菜单或部门树
     *
     * @param nodes nodes
     * @return <T> List<? extends Tree>
     */
    public static <T> List<? extends Tree<?>> build(List<? extends Tree<T>> nodes) {
        if (ObjectUtil.isNull(nodes)) {
            return null;
        }

        List<Tree<T>> topNodes = new ArrayList<>();
        nodes.forEach(node -> {
            if (ObjectUtil.isNull(node.getParentId()) || TOP_NODE_ID.equals(node.getParentId())) {
                topNodes.add(node);
                return;
            }

            for (Tree<T> n : nodes) {
                if (ObjectUtil.isNotNull(n.getId()) && n.getId().equals(node.getParentId())) {
                    if (ObjectUtil.isNull(n.getChildren())) {
                        n.initChildren();
                    }

                    n.getChildren().add(node);
                    node.setHasParent(true);
                    n.setHasParent(true);
                    return;
                }
            }

            if (topNodes.isEmpty()) {
                topNodes.add(node);
            }
        });
        return topNodes;
    }

}
